<?php
declare (strict_types = 1);

namespace app\admin\model;



/**
 * 角色模型
 * Class Role
 * @package app\admin\model
 */
class Role extends BaseModel
{
    protected $table = 'roles';
    
    // 字段类型
    protected $type = [
        'id' => 'integer',
        'status' => 'integer',
        'sort_order' => 'integer',
        'created_at' => 'datetime',
        'updated_at' => 'datetime'
    ];
    
    // 自动完成
    protected $auto = [];
    protected $insert = ['created_at'];
    protected $update = ['updated_at'];
    
    /**
     * 创建时间
     * @return string
     */
    protected function setCreatedAtAttr()
    {
        return date('Y-m-d H:i:s');
    }
    
    /**
     * 更新时间
     * @return string
     */
    protected function setUpdatedAtAttr()
    {
        return date('Y-m-d H:i:s');
    }
    
    /**
     * 关联用户
     * @return \think\model\relation\BelongsToMany
     */
    public function users()
    {
        return $this->belongsToMany('User', 'user_roles', 'user_id', 'role_id');
    }
    
    /**
     * 关联权限
     * @return \think\model\relation\BelongsToMany
     */
    public function permissions()
    {
        return $this->belongsToMany('Permission', 'role_permissions', 'permission_id', 'role_id');
    }
    
    /**
     * 获取角色列表
     * @param int $page 页码
     * @param int $limit 每页记录数
     * @param array $where 查询条件
     * @return \think\Paginator
     */
    public static function getRoleList($page = 1, $limit = 20, $where = [])
    {
        $query = self::order('sort_order', 'asc');
        
        // 角色名称
        if (!empty($where['role_name'])) {
            $query->where('role_name', 'like', '%' . $where['role_name'] . '%');
        }
        
        // 状态
        if (isset($where['status'])) {
            $query->where('status', $where['status']);
        }
        
        return $query->paginate($limit, false, [
            'page' => $page
        ]);
    }
    
    /**
     * 获取所有启用的角色
     * @return array
     */
    public static function getEnabledRoles()
    {
        return self::where('status', 1)
            ->order('sort_order', 'asc')
            ->select();
    }
    
    /**
     * 分配权限
     * @param array $permissionIds 权限ID数组
     * @return bool
     */
    public function assignPermissions($permissionIds)
    {
        // 先清除原有权限
        \think\Db::name('role_permissions')->where('role_id', $this->id)->delete();
        
        if (empty($permissionIds)) {
            return true;
        }
        
        // 添加新权限
        $data = [];
        foreach ($permissionIds as $permissionId) {
            $data[] = [
                'role_id' => $this->id,
                'permission_id' => $permissionId,
                'created_at' => date('Y-m-d H:i:s')
            ];
        }
        
        return \think\Db::name('role_permissions')->insertAll($data) > 0;
    }
}